from django.contrib.auth.decorators import login_required
from functools import wraps

from django.http import JsonResponse
from django.db import transaction


class LoginRequiredMixin(object):
    """重写as_view()
    mixin方法
    """

    @classmethod
    def as_view(cls, **initkwargs):
        """使用login_required装饰其，
        装饰view， 在使用的时候，由于python的多继承规则
        视图类可以继承到另外一个父类的as_view，
        login_required验证通过后才会跳转到请求的页面，否则退回到登陆页


        """
        view = super().as_view(**initkwargs)

        # 返回view装饰器装饰后的结果
        return login_required(view)

def login_required_json(view_func):
    """装饰器，但是要保证其装饰的函数保证原来的名字
    能够响应post、get请求，所以自身需要用wraps装饰
    """
    @wraps(view_func)
    def wrapper(request, *args, **kwargs):
        # 如果未邓丽，返回json数据，用户未登陆
        if not request.user.is_authenticated():
            return JsonResponse({'code':1, 'message': '用户未登陆'})
        else:
            # 如果用户登陆，进入到view_func中
            return view_func(request, *args, **kwargs)
    return wrapper


class LoginRequiredJsonMixin(object):

    @classmethod
    def as_view(cls, **initkwargs):
        view = super().as_view(**initkwargs)
        return login_required_json(view)




# 事务装饰器
class TransactionAtomicMixin(object):
    """提供数据库事务功能"""
    @classmethod
    def as_view(cls, **initkwargs):
        view = super(TransactionAtomicMixin, cls).as_view(**initkwargs)
        return transaction.atomic(view)
